<?php
// 前台登录类
namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use DB;
use Session;


class LoginController extends Controller
{
	private static $phoneCode = '';

    //渲染第三方登录注册页面
    public function create(){
        return view('login.create');
    }

	// 登录页面 (已废弃)
    public function login( $next_url='' )
	{
		if( $next_url=='next_url' )
		{
			// Session::put('next_url','/cart');
		}else
		{
			// Session::put('next_url','');
		}
		
		// 获取cookie
		// $isLogin = \Cookie::get('isLogin');
		
		// 上次登录选中了 一周免登陆
		// if( $isLogin )
		// {
			// $user_info = DB::table('user')
							// -> where( 'id','=',$isLogin )
							// 状态正常
							// -> where( 'status','=','1' )
							// -> first();
			// $name = $user_info ->name;
			// $pass = $user_info ->pass;
			// 带着名字 密码 到登录页面
			// return view('login.login',['name'=>$name,'pass'=>$pass]);
		// }
		
		// 登录页面
		// return view('login.login');
	}
	
	// 执行 用户登录
	public function doLogin( $next_url='', Request $request )
	{
		
		// 验证登录信息
		$data = $request -> except('_token');
		
		if( empty($data['name']) )
		{
			return back()->with( ['info'=>'请输入账号/手机号'] );
		}
		if( empty($data['pass']) )
		{
			return  back()->with( ['info'=>'请输入密码','name'=>$data['name'] ] );
		}
		
		if( empty($data['loginCode']) )
		{
			return  back()->with( ['info'=>'请输入验证码','name'=>$data['name'] ] );
		}
		
		if( Session::get('loginCode')!=$data['loginCode']  )
		{
			return  back()->with( ['info'=>'验证码有误','name'=>$data['name'] ] );
		}

		// 加密
		$data['pass'] = md5( $data['pass'] );
		
		// 账户 密码
		$user_info = DB::table('user')
						// 账户
						-> where( 'name','=',$data['name'] )
						// 密码
						-> where( 'pass','=',$data['pass'] )
						-> first();
		
		// 账户 密码 查不到
		if( empty($user_info) )
		{
			// 电话 密码
			$user_info = DB::table('user')
						// 电话
						-> where( 'phone','=',$data['name'] )
						// 密码
						-> where( 'pass','=',$data['pass'] )
						-> first();
		}
		
		// 验证 通过 
		if( $user_info )
		{
			if( $user_info-> status == '2' )
			{
				return back()->with( [ 'info'=>'此账号已冻结','name'=>$data['name'] ] );
			}
			
			// 获取用户ID
			$user_id = intval( $user_info->id ) ;
			// 1. 修改 登录时间
			$res = 	DB::table('user')
						->where( 'id','=',$user_id )
						->update(['lasttime'=>date('Y-m-d H:i:s',time())]);
			// 2. 是否 记住	
			if( $request -> has('rememberMe') )
			{
				// 记住我
				// 设置cookie 7天免登录
				\Cookie::queue( 'isLogin' , $user_id ,60*24*7 );
			}else
			{
				// 设置cookie 为空
				\Cookie::queue('isLogin','');
			}
			// 获取 用户信息
			$current_user = $this -> getUserName( $user_id );
			// 3. 设置session 用户ID
			Session::put('user_id',$user_id);
			// 设置session 用户名
			Session::put('user_name',$current_user -> name ); 
			
			if( !empty($next_url) )
			{
				// 生成重定向
				return redirect()->action('IndexController@index');
			}
			return back();
			
		}else
		{
			// 验证 失败
			return back()->with( [ 'info'=>"请检查用户名或密码",'name'=>$data['name'] ] );
		}
	}
	
	
	// 退出登录
	public function loginOut()
	{
		
		// 清除session
		Session::forget('user_id');
		Session::forget('user_name');
		// 清除cookie
		\Cookie::queue('isLogin','');
		return back();
		// return redirect('/');
	
	
	}
	
	
	public static function geturl( $url )
    {
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);// 将返回结果进行转换
        $res = curl_exec($ch);						// 发送请求
        return $res;								// 将结果返返回
    }
	
	
	// 发送 手机验证码
	public function sendPhoneCode( $type='',Request $request )
	{
		// 获取 手机号
		$data = $request -> except('_token');
		if( empty($data['phone']) )
		{
			$this -> show_msg('请输入手机号');
		}
		
		$user_info = DB::table('user')
					// 电话
					-> where( 'phone','=',$data['phone'] )
					// 状态正常
					-> where( 'status','=','1' )
					-> first();
		if( $type=='' )
		{
			// 注册时 或 修改 手机号
			// 手机号已存在
			if( $user_info )
			{
				$this -> show_msg('该手机号已经注册');
			}
		}else
		{
			// 重置 密码  时
			if( !$user_info )
			{
				$this -> show_msg('该手机号还未注册');
			}
		}
		
		
		// 随机验证码
		$english = '0123456789';
		$code = '';
		for($j=1;$j<=4;$j++){
			// 设置验证码
			$code .= $english[ rand(0,9) ];
		}
		
		// 短信 验证码
		// 短信 接口
		$sms_url = 'http://api.sms.cn/sms/?ac=send&uid=zhizhutv&pwd=e17ba20ee21f341047ca7b3ac6cdeb60&template=400898&mobile='.$data['phone'].'&content={"code":"'.$code.'"}';
		$luanma = $this::geturl( $sms_url );
		// 转码
		$utf8 = iconv( "gb2312","utf-8",$luanma );
		$arr = json_decode( $utf8,true );
		if( $arr['stat']==100 )
		{
			// 发送成功
			$this -> show_msg('发送成功，请注意查收',$code);
		}elseif( $arr['stat']==112 )
		{
			$this -> show_msg('请输入正确的手机号');
		}elseif( $arr['stat']==124 )
		{
			$this -> show_msg('号码已被限制，请明日重试');
		}else
		{
			// 发送失败
			$this -> show_msg('发送失败');
		}
	
	}
	
	// 执行 用户注册
    public function doReg(Request $request)
	{
		$data = $request -> except('_token');
		
		// 账号 名称 为空
		if( empty($data['name']) ){
			$this -> show_msg('请输入账号');
		}else
		{
			// 查询 账号 是否已注册
			$user = DB::table('user')
					-> where( 'name','=',$data['name'] )
					-> first();
			if( !empty($user) )
			{
				$this -> show_msg('账号已存在，请更换账号名');
			}
		}
		
		// 电话 为空
		if( empty($data['phone']) )
		{
			$this -> show_msg('请输入手机号码');
		}else
		{
			// 查询 电话是否已注册
			$user = DB::table('user')
					-> where('phone','=',$data['phone'])
					-> first();
			if( !empty($user) )
			{
				$this -> show_msg('该手机号已经注册');
			}
		}
		if( empty($data['code']) )
		{
			// 线上 打开
			$this -> show_msg('请先获取验证码');
		}
		if( empty($data['phoneCode']) )
		{
			$this -> show_msg('请输入手机验证码');
		}
		// 输入的验证码 和 发送的 进行比较
		if( $data['phoneCode']!= $data['code'] )
		{
			// 线上 打开
			$this -> show_msg('验证码有误');
		}
		
		// 密码 为空
		if( empty($data['pass']) )
		{
			$this -> show_msg('请输入密码');
		}
		// 确认密码
		if( empty($data['repass']) )
		{
			$this -> show_msg('请输入确认密码');
		}
		if( $data['pass']!= $data['repass'] )
		{
			$this -> show_msg('两次密码输入不一致');
		}
		// 加 密
		$data['pass'] = md5($data['pass']);
		$data['regtime']=date('Y-m-d H:i:s',time());
		$data['lasttime']=date('Y-m-d H:i:s',time());
		$data['pic_url']="/images/moren.jpg";
		unset( $data['repass'],$data['phoneCode'],$data['code'] );
		// 插入
		$insert_id = DB::table('user')->insertGetId($data);
		if( $insert_id )
		{
			$this -> show_msg('注册成功,可立即登录');
		}else
		{
			$this -> show_msg('注册失败');
		}
	}
	
	
	// 忘记密码 加载页面
	public function forgetPass()
	{
		return view('login.password');
	
	}
	
	// 忘记密码 第一步 验证 注册的手机号
    public function checkPhone(Request $request)
	{
		$data = $request -> except('_token');
		
		// 电话 为空
		if( empty($data['phone']) )
		{
			$this -> show_msg('请输入手机号码');
		}
		
		// 查询 电话是否已注册
		$user = DB::table('user')
					-> where('phone','=',$data['phone'])
					-> first();
		if( empty($user) )
		{
			// 线上 打开
			$this -> show_msg('该手机号暂未注册');
		}
		if( empty($data['code']) )
		{
			// 线上 打开
			$this -> show_msg('请先获取验证码');
		}
		if( empty($data['phoneCode']) )
		{
			// 线上 打开
			$this -> show_msg('请输入手机验证码');
		}
		// 输入的验证码 和 发送的 进行比较
		if( $data['phoneCode']!= $data['code'] )
		{
			// 线上 打开
			$this -> show_msg('验证码有误');
		}
		// 并返回手机号
		$this -> show_msg( '验证通过',$data['phone'] );
		
	}
	
	// 执行 重置密码
	public function doReset( Request $request)
	{
		
		$data = $request -> except('_token');
		// 密码 为空
		if( empty($data['pass']) )
		{
			$this -> show_msg('请输入新密码');
		}
		// 确认密码
		if( empty($data['repass']) )
		{
			$this -> show_msg('请输入确认密码');
		}
		if( $data['pass']!= $data['repass'] )
		{
			$this -> show_msg('两次密码输入不一致');
		}
		
		// 更改密码
		$res = DB::table('user')
					-> where('phone','=',$data['phone'] )
					-> update( ['pass'=>md5($data['pass'])] );
		if( $res )
		{
			$this->show_msg('重置成功');
		}
		
		$this->show_msg('重置失败');
		
	}
	
	
	// 个人中心 基本资料
	public function doInfo( Request $request )
	{
		if( !Session::get('user_id') )
		{
			$this -> show_msg('请先登录');
		}
		// 包含 email qq desc
		$data = $request -> except('_token');
		if( empty($data['email']) )
		{
			$this -> show_msg('请输入邮箱');
		}
		$email_pattern = "/^\w+@\w+\.(com|com\.cn|org|cn|com.org|tv)$/";
		preg_match_all($email_pattern,$data['email'],$email_arr);
		if( count($email_arr[0]) < 1 )
		{
			$this -> show_msg('请输入正确的邮箱地址');
		}
		
		$history_email = DB::table('user')
				-> where( 'email','=',$data['email'] )
				-> where( 'id','!=',Session::get('user_id') )
				-> first();
		if( $history_email  )
		{
			$this -> show_msg('该邮箱已经注册');
		}
		
		
		if( empty($data['qq']) )
		{
			$this -> show_msg('请输入QQ');
		}
		$qq_pattern = "/^\d{5,10}$/";
		preg_match_all($qq_pattern,$data['qq'],$qq_arr);
		if( count($qq_arr[0]) < 1 )
		{
			$this -> show_msg('请输入正确的QQ格式');
		}
		$history_qq = DB::table('user')
				-> where( 'qq','=',$data['qq'] )
				-> where( 'id','!=',Session::get('user_id') )
				-> first();
		if( $history_qq  )
		{
			$this -> show_msg('该QQ已经注册');
		}
		
		if( empty($data['desc']) )
		{
			$data['desc'] = '';
		}
		
		// 修改基本资料
		$res = DB::table('user')
				-> where('id','=',Session::get('user_id'))
				-> update( [ 'email'=>$data['email'],'qq'=>intval($data['qq']),'desc'=>$data['desc'] ] );
		if( $res )
		{
			$this -> show_msg('保存成功');
		}else
		{
			$this -> show_msg('保存失败');
		}
	
	}
	
	
	// 个人中心 修改头像页面
	public function doUserPic()
	{
		if( !Session::get('user_id') )
		{
			return redirect('/');
		}


		return view('article.pic');
	
	}
	
	// 执行 上传 头像
	public function doUserPicture()
	{
		// 日期 作为新建目录名
		$time = date('Y-m-d');
		// 线上 目标目录 
		$dir= "../../image/images/user/".$time;
		// 检测 文件 或者 目录 是否存在
		if( !file_exists($dir) )
		{	
			// 创建 目录
			mkdir( $dir,0777,true );
		}
		$filename = '';
		foreach( $_FILES as $key => $file_info )
		{
			$image_info=getimagesize($file_info['tmp_name']);
			if( $image_info[0]>800 || $image_info[1]>500 ){
				echo  "<script>window.parent.showerror('请上传尺寸小于800*500的图片')</script>";
				return ;
			}
			
			if( $file_info['size'] > 2097152 )
			{
				echo  "<script>window.parent.showerror('请上传小于2M的图片')</script>";
				return ;
			}
			// 文件名
			$fileName = $file_info['name'];
			// 通过文件名 后缀
			$ext = pathinfo( $fileName,PATHINFO_EXTENSION );
			if( !in_array($ext,array('jpg','jpeg','png','gif') )  )
			{
				echo  "<script>window.parent.showerror('请上传正确格式的图片')</script>";
				return ;
			}
			// 临时目录
			$srcDir = $file_info['tmp_name'];
			// 新的 文件名
			$newName = rand(1,1000000).".".$ext;
			// 移动成功
			$res = move_uploaded_file( $srcDir, $dir."/".$newName );
			$filename="/images/user/".$time."/".$newName;
			if( $res )
			{
				// 线上
				$file = str_replace("/images",config('app.imgPath')."/images",$filename);
				// 返回 显示 图片
				echo  "<script>window.parent.showPic('".$file."')</script>";
				return ;
			}else
			{
				echo  "<script>window.parent.showerror('上传失败')</script>";
				return ;
			}
			break;
		}
		
		
	
	}
	
	// 执行 图片 裁剪 （废弃）
    public function doJcrop33( Request $request )
	{
        
		// 接收信息
		$data = $request -> except('_token');
		
		if( empty($data['picname']) )
		{
			$this -> show_msg('请先上传图片');
			
		}
		
		// 获取 裁剪的起始位置
        $x = $data['cx'];
        $y = $data['cy'];
		
		// 获取 裁剪的宽和高
		if( empty($data['cw']) || empty($data['ch']) )
		{
			$this -> show_msg('请选择裁剪范围');
		}
		
        $width = $data['cw'];
        $height = $data['ch'];
		
		// 老图片 地址
        $old = $data['picname'];
		
		$pos = strrpos($old,"/")+1;
		// 获取文件名
		$filename = substr($old,$pos);
		// 获取目录名
		$dir = substr($old,$pos-11,10);
		// 获取 图片后缀
		$ext = pathinfo( $old,PATHINFO_EXTENSION );
		switch( $ext )
		{
			case 'jpg':
			case 'jpeg':
				// 原图
				$origin = imagecreatefromjpeg($old);
			break;
			case 'png':
				$origin = imagecreatefrompng($old);
			break;
		}
		
		//创建 裁剪后的图片
        $new = imagecreatetruecolor($width,$height);
		// 复制 图像的一部分 new 0,0开始 origin x y 宽 高
		$res = imagecopy($new,$origin,0,0,$x,$y,$width,$height); 
		if( !$res )
		{
			$this -> show_msg('裁剪失败');
		}
		// 输出
		switch( $ext )
		{
			case 'jpg':
			case 'jpeg':
				imagejpeg($new,'../../image/images/user/'.$dir."/".$filename);
			break;
			case 'png':
				imagepng($new,'../../image/images/user/'.$dir."/".$filename);
			break;
		}
		
		
		
		// 删除 磁盘旧图
		$user_info = DB::table('user')
						-> where( 'id','=',Session::get('user_id') )
						-> first();
		// 线上
		$file = "../../image".$user_info -> pic_url;
		// 文件 存在
		if( file_exists($file) )
		{
			// 删除 文件
			unlink( $file );	
		}
		
		$newDir = "/images/user/".$dir."/".$filename;
		$res = DB::table('user')
				-> where( 'id','=',Session::get('user_id') )
				-> update( [ 'pic_url'=>$newDir ] );
		if( $res )
		{
			$this -> show_msg('修改头像成功');
		}
		
		
		
		
    }
	
	
	// 执行 下载并更新 头像
    public function doJcrop( Request $request )
	{
        
		// 接收信息
		$data = $request -> except('_token');
		
		if( empty($data['newphoto']) )
		{
			$this -> show_msg('请先上传图片');
		}
		
		// 下载新图片
		$content = file_get_contents($data['newphoto']);
		// 新图片
		$newDir = "../../image/images/user/".date('Y-m-d');
		
		// 检测 文件 或者 目录 是否存在
		if( !file_exists($newDir) )
		{	
			// 创建 目录
			mkdir( $newDir,0777,true );
		}
		
		$filename= "/".time().rand(0,9999).'.jpg';
		$perfect = $newDir.$filename;
		$res = file_put_contents( $perfect, $content);
		
		// 删除 磁盘旧图
		$user_info = DB::table('user')
						-> where( 'id','=',Session::get('user_id') )
						-> first();
		
		
		if( $user_info -> pic_url=='/images/moren.jpg' )
		{
			// 不用删
		}else
		{
			// 线上
			$file = "../../image".$user_info -> pic_url;
			// 文件 存在
			if( file_exists($file) )
			{
				// 删除 文件
				unlink( $file );	
			}
		}
		// 更新 头像
		$newPath = substr( $perfect,11);
		$res = DB::table('user')
				-> where( 'id','=',Session::get('user_id') )
				-> update( [ 'pic_url'=>$newPath ] );
		if( $res )
		{
			$this -> show_msg('修改头像成功');
		}
		
	}
	
	
	
	
	// 个人中心 修改密码
	public function doPass( Request $request )
	{
		if( !Session::get('user_id') )
		{
			$this -> show_msg('请先登录');
		}
		$data = $request -> except('_token');
		
		if( empty($data['oldPass']) )
		{
			$this -> show_msg('请输入当前密码');
		}
		
		// 密码 为空
		if( empty($data['pass']) )
		{
			$this -> show_msg('请输入新密码');
		}
		// 确认密码
		if( empty($data['repass']) )
		{
			$this -> show_msg('请输入确认密码');
		}
		
		if( $data['pass']!= $data['repass'] )
		{
			$this -> show_msg('两次密码输入不一致');
		}
		
		// 先判断旧密码是否正确
		$history = DB::table('user')
					-> where( 'id','=',Session::get('user_id') )
					-> where('pass','=',md5($data['oldPass']) )
					-> first();
		
		
		if( $history )
		{
			// 旧密码通过
			// 更改密码
			$res = DB::table('user')
					-> where( 'id','=',Session::get('user_id') )
					// md5加密
					-> update( ['pass'=>md5($data['pass'])] );
			if( $res )
			{
				$this->show_msg('修改成功');
			}
			
			$this->show_msg('修改失败');
		
		}else
		{
			$this->show_msg('当前密码不正确');
		}
		
	
	}
	
	
	// 个人中心 修改 账户名称
	public function doUsername( Request $request )
	{
		if( !Session::get('user_id') )
		{
			$this -> show_msg('请先登录');
		}
		
		// 包含 用户 名
		$data = $request -> except('_token');
		if( empty($data['name']) )
		{
			$this -> show_msg('无任何输入');
		}
		$history = DB::table('user')
				-> where( 'name','=',$data['name'] )
				-> first();
		if( $history  )
		{
			$this -> show_msg('该账户名已经注册');
		}
		
		$user_info = DB::table('user')
				-> select('upNameTime')
				-> where('id','=',Session::get('user_id'))
				-> first();
		if( $user_info -> upNameTime=='0000-00-00 00:00:00'  )
		{
		
			// 时间上 可以修改 账户名称
			// 执行 修改
			$res = DB::table('user')
				-> where('id','=',Session::get('user_id'))
				-> update( [ 'name'=>$data['name'],'upNameTime'=>date('Y-m-d H:i:s') ] );
			
		}else
		{
			// 上次 修改账户名称的 时间戳
			$old =  strtotime($user_info -> upNameTime);
			// 下次 允许 修改的时间
			$allow_line = $old + 30*24*60*60;
			$now = time();
			if( $now < $allow_line )
			{
				$this -> show_msg('一个月内只可修改一次');
			}else
			{
				// 执行 修改
				$res = DB::table('user')
					-> where('id','=',Session::get('user_id'))
					-> update( [ 'name'=>$data['name'],'upNameTime'=>date('Y-m-d H:i:s') ] );
			}
			
		}
		
		if( $res )
		{
			// $this -> resetsessoion();
			$this -> show_msg('修改成功');
		}else
		{
			$this -> show_msg('修改失败');
		}
		
	}
	
	// 重新设置session
	public function resetsessoion()
	{
		$user_info = DB::table('user')
			-> select('name')
			-> where('id','=',Session::get('user_id'))
			-> first();
		if( Session::get('user_name') )
		{
			Session::forget('user_name');
		}
		// 设置session 用户名
		Session::put('user_name',$user_info->name ); 
		// 生成重定向
		// return redirect()->action('IndexController@index');
	}
	
	
	// 个人中心 修改手机号
	public function doUserPhone( Request $request )
	{
		if( !Session::get('user_id') )
		{
			$this -> show_msg('请先登录');
		}
		// 包含 新手机号 输入的验证码 与 发送的验证码
		$data = $request -> except('_token');
		if( empty( $data['newPhone'] ) )
		{
			$this -> show_msg('请输入手机号');
		}
		
		if( empty($data['sendPhoneCode']) )
		{
			// 线上打开
			$this -> show_msg('请先获取验证码');
		}
		
		if( empty($data['inputPhoneCode']) )
		{
			$this -> show_msg('请输入手机验证码');
		}
		
		
		if( $data['inputPhoneCode']!= $data['sendPhoneCode'] )
		{
			// 线上 打开
			$this -> show_msg('验证码有误');
		}
		
		$history = DB::table('user')
				-> where( 'phone','=',$data['newPhone'] )
				-> first();
		if( $history  )
		{
			$this -> show_msg('该手机号已经注册');
		}else
		{
			// 修改 手机号
			$res = DB::table('user')
					-> where('id','=',Session::get('user_id'))
					-> update( [ 'phone'=>$data['newPhone'] ] );
		}
		
		if( $res )
		{
			$this -> show_msg('修改成功');
		}
		
		$this -> show_msg('修改失败');
		
	}

}
